{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import nltk"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['austen-emma.txt',\n",
       " 'austen-persuasion.txt',\n",
       " 'austen-sense.txt',\n",
       " 'bible-kjv.txt',\n",
       " 'blake-poems.txt',\n",
       " 'bryant-stories.txt',\n",
       " 'burgess-busterbrown.txt',\n",
       " 'carroll-alice.txt',\n",
       " 'chesterton-ball.txt',\n",
       " 'chesterton-brown.txt',\n",
       " 'chesterton-thursday.txt',\n",
       " 'edgeworth-parents.txt',\n",
       " 'melville-moby_dick.txt',\n",
       " 'milton-paradise.txt',\n",
       " 'shakespeare-caesar.txt',\n",
       " 'shakespeare-hamlet.txt',\n",
       " 'shakespeare-macbeth.txt',\n",
       " 'whitman-leaves.txt']"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.corpus import gutenberg\n",
    "gutenberg.fileids()   # 获取语料库标识符"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "192427"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "emma = gutenberg.words('austen-emma.txt')  # 获取《爱玛》语料\n",
    "len(emma)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Displaying 25 of 37 matches:\n",
      "er father , was sometimes taken by surprize at his being still able to pity ` \n",
      "hem do the other any good .\" \" You surprize me ! Emma must do Harriet good : a\n",
      "Knightley actually looked red with surprize and displeasure , as he stood up ,\n",
      "r . Elton , and found to his great surprize , that Mr . Elton was actually on \n",
      "d aid .\" Emma saw Mrs . Weston ' s surprize , and felt that it must be great ,\n",
      "father was quite taken up with the surprize of so sudden a journey , and his f\n",
      "y , in all the favouring warmth of surprize and conjecture . She was , moreove\n",
      "he appeared , to have her share of surprize , introduction , and pleasure . Th\n",
      "ir plans ; and it was an agreeable surprize to her , therefore , to perceive t\n",
      "talking aunt had taken me quite by surprize , it must have been the death of m\n",
      "f all the dialogue which ensued of surprize , and inquiry , and congratulation\n",
      " the present . They might chuse to surprize her .\" Mrs . Cole had many to agre\n",
      "the mode of it , the mystery , the surprize , is more like a young woman ' s s\n",
      " to her song took her agreeably by surprize -- a second , slightly but correct\n",
      "\" \" Oh ! no -- there is nothing to surprize one at all .-- A pretty fortune ; \n",
      "t to be considered . Emma ' s only surprize was that Jane Fairfax should accep\n",
      "of your admiration may take you by surprize some day or other .\" Mr . Knightle\n",
      "ation for her will ever take me by surprize .-- I never had a thought of her i\n",
      " expected by the best judges , for surprize -- but there was great joy . Mr . \n",
      " sound of at first , without great surprize . \" So unreasonably early !\" she w\n",
      "d Frank Churchill , with a look of surprize and displeasure .-- \" That is easy\n",
      "; and Emma could imagine with what surprize and mortification she must be retu\n",
      "tled that Jane should go . Quite a surprize to me ! I had not the least idea !\n",
      " . It is impossible to express our surprize . He came to speak to his father o\n",
      "g engaged !\" Emma even jumped with surprize ;-- and , horror - struck , exclai\n"
     ]
    }
   ],
   "source": [
    "emma = nltk.Text(emma)  # 获取单个文本检索信息对象\n",
    "emma.concordance('surprize')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "887071\n",
      "['[', 'Emma', 'by', 'Jane', 'Austen', '1816', ']', ...]\n",
      "[['[', 'Emma', 'by', 'Jane', 'Austen', '1816', ']'], ['VOLUME', 'I'], ...]\n"
     ]
    }
   ],
   "source": [
    "print(len(gutenberg.raw('austen-emma.txt')))  # 原文\n",
    "print(gutenberg.words('austen-emma.txt'))  # 词汇集\n",
    "print(gutenberg.sents('austen-emma.txt'))  # 句子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "firefox.txt Cookie Manager: \"Don't allow sites that set remove\n",
      "grail.txt SCENE 1: [wind] [clop clop clop] \n",
      "KING ARTHUR: Who\n",
      "overheard.txt White guy: So, do you have any plans for this even\n",
      "pirates.txt PIRATES OF THE CARRIBEAN: DEAD MAN'S CHEST, by Ted\n",
      "singles.txt 25 SEXY MALE, seeks attrac older single lady, for \n",
      "wine.txt Lovely delicate, fragrant Rhone wine. Polished lea\n"
     ]
    }
   ],
   "source": [
    "from nltk.corpus import webtext  # 网络文本集\n",
    "for fileid in webtext.fileids():\n",
    "    print(fileid, webtext.raw(fileid)[:50])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['i',\n",
       " 'do',\n",
       " \"n't\",\n",
       " 'want',\n",
       " 'hot',\n",
       " 'pics',\n",
       " 'of',\n",
       " 'a',\n",
       " 'female',\n",
       " ',',\n",
       " 'I',\n",
       " 'can',\n",
       " 'look',\n",
       " 'in',\n",
       " 'a',\n",
       " 'mirror',\n",
       " '.']"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.corpus import nps_chat  # 即时聊天回话预料库\n",
    "chatroom = nps_chat.posts('10-19-20s_706posts.xml')\n",
    "chatroom[123]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['adventure',\n",
       " 'belles_lettres',\n",
       " 'editorial',\n",
       " 'fiction',\n",
       " 'government',\n",
       " 'hobbies',\n",
       " 'humor',\n",
       " 'learned',\n",
       " 'lore',\n",
       " 'mystery',\n",
       " 'news',\n",
       " 'religion',\n",
       " 'reviews',\n",
       " 'romance',\n",
       " 'science_fiction']"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.corpus import brown  # 布朗预料库\n",
    "brown.categories()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['The', 'Fulton', 'County', 'Grand', 'Jury', 'said', ...]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "brown.words(categories='news')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Does', 'our', 'society', 'have', 'a', 'runaway', ',', ...]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "brown.words(fileids=['cg22'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['The', 'Fulton', 'County', 'Grand', 'Jury', 'said', 'Friday', 'an', 'investigation', 'of', \"Atlanta's\", 'recent', 'primary', 'election', 'produced', '``', 'no', 'evidence', \"''\", 'that', 'any', 'irregularities', 'took', 'place', '.'], ['The', 'jury', 'further', 'said', 'in', 'term-end', 'presentments', 'that', 'the', 'City', 'Executive', 'Committee', ',', 'which', 'had', 'over-all', 'charge', 'of', 'the', 'election', ',', '``', 'deserves', 'the', 'praise', 'and', 'thanks', 'of', 'the', 'City', 'of', 'Atlanta', \"''\", 'for', 'the', 'manner', 'in', 'which', 'the', 'election', 'was', 'conducted', '.'], ...]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "brown.sents(categories=['news', 'editorial', 'reviews'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 比较不同文体中情态动词的用法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "can:94\n",
      "could:87\n",
      "may:93\n",
      "might:38\n",
      "must:53\n",
      "will:389\n"
     ]
    }
   ],
   "source": [
    "from nltk.corpus import brown\n",
    "\n",
    "news_text = brown.words(categories='news')\n",
    "fdist = nltk.FreqDist([w.lower() for w in news_text])  # 统计词频\n",
    "modals = ['can', 'could', 'may', 'might', 'must', 'will']\n",
    "for m in modals:\n",
    "    print(m + ':' + str(fdist[m]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<ConditionalFreqDist with 15 conditions>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 获取不同文体以及对应的词\n",
    "cfd = nltk.ConditionalFreqDist(\n",
    "    (genre, word) for genre in brown.categories()\n",
    "                    for word in brown.words(categories=genre))\n",
    "cfd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                  can could   may might  must  will \n",
      "           news    93    86    66    38    50   389 \n",
      "       religion    82    59    78    12    54    71 \n",
      "        hobbies   268    58   131    22    83   264 \n",
      "science_fiction    16    49     4    12     8    16 \n",
      "        romance    74   193    11    51    45    43 \n",
      "          humor    16    30     8     8     9    13 \n"
     ]
    }
   ],
   "source": [
    "genres = ['news', 'religion', 'hobbies', 'science_fiction', 'romance', 'humor']\n",
    "modals = ['can', 'could', 'may', 'might', 'must', 'will']\n",
    "# 对指定文体的指定词计算词频\n",
    "cfd.tabulate(conditions=genres, samples=modals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['test/14826',\n",
       " 'test/14828',\n",
       " 'test/14829',\n",
       " 'test/14832',\n",
       " 'test/14833',\n",
       " 'test/14839',\n",
       " 'test/14840',\n",
       " 'test/14841',\n",
       " 'test/14842',\n",
       " 'test/14843']"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.corpus import reuters  # 路透社预料库\n",
    "reuters.fileids()[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['acq',\n",
       " 'alum',\n",
       " 'barley',\n",
       " 'bop',\n",
       " 'carcass',\n",
       " 'castor-oil',\n",
       " 'cocoa',\n",
       " 'coconut',\n",
       " 'coconut-oil',\n",
       " 'coffee',\n",
       " 'copper',\n",
       " 'copra-cake',\n",
       " 'corn',\n",
       " 'cotton',\n",
       " 'cotton-oil',\n",
       " 'cpi',\n",
       " 'cpu',\n",
       " 'crude',\n",
       " 'dfl',\n",
       " 'dlr']"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reuters.categories()[:20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['barley', 'corn', 'grain', 'trade', 'wheat']"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reuters.categories(['training/9865', 'test/14826'])  # 获取指定集的类别信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['test/14832',\n",
       " 'test/14858',\n",
       " 'test/15033',\n",
       " 'test/15043',\n",
       " 'test/15106',\n",
       " 'test/15287',\n",
       " 'test/15341',\n",
       " 'test/15618',\n",
       " 'test/15648',\n",
       " 'test/15649']"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reuters.fileids(['barley', 'corn'])[:10]  # 指定类别查询语料集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['FRENCH',\n",
       " 'FREE',\n",
       " 'MARKET',\n",
       " 'CEREAL',\n",
       " 'EXPORT',\n",
       " 'BIDS',\n",
       " 'DETAILED',\n",
       " 'French',\n",
       " 'operators',\n",
       " 'have',\n",
       " 'requested',\n",
       " 'licences',\n",
       " 'to',\n",
       " 'export',\n",
       " '675']"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reuters.words('training/9865')[:15]  # 开头大写的是题目"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['FRENCH',\n",
       " 'FREE',\n",
       " 'MARKET',\n",
       " 'CEREAL',\n",
       " 'EXPORT',\n",
       " 'BIDS',\n",
       " 'DETAILED',\n",
       " 'French',\n",
       " 'operators',\n",
       " 'have',\n",
       " 'requested',\n",
       " 'licences',\n",
       " 'to',\n",
       " 'export',\n",
       " '675']"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reuters.words(['training/9865', 'training/9880'])[:15]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['FRENCH',\n",
       " 'FREE',\n",
       " 'MARKET',\n",
       " 'CEREAL',\n",
       " 'EXPORT',\n",
       " 'BIDS',\n",
       " 'DETAILED',\n",
       " 'French',\n",
       " 'operators',\n",
       " 'have',\n",
       " 'requested',\n",
       " 'licences',\n",
       " 'to',\n",
       " 'export',\n",
       " '320']"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reuters.words(categories=['barley'])[:15]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1789-Washington.txt',\n",
       " '1793-Washington.txt',\n",
       " '1797-Adams.txt',\n",
       " '1801-Jefferson.txt',\n",
       " '1805-Jefferson.txt',\n",
       " '1809-Madison.txt',\n",
       " '1813-Madison.txt',\n",
       " '1817-Monroe.txt',\n",
       " '1821-Monroe.txt',\n",
       " '1825-Adams.txt']"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.corpus import inaugural  # 就职演说预料库\n",
    "inaugural.fileids()[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1789',\n",
       " '1793',\n",
       " '1797',\n",
       " '1801',\n",
       " '1805',\n",
       " '1809',\n",
       " '1813',\n",
       " '1817',\n",
       " '1821',\n",
       " '1825']"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[fileid[:4] for fileid in inaugural.fileids()][:10]  # 获取时间"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x20062ed7040>"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 绘制不同词在随时间演讲时的变换\n",
    "cfd = nltk.ConditionalFreqDist(\n",
    "    (target, fileid[:4]) for fileid in inaugural.fileids()\n",
    "                            for w in inaugural.words(fileid)\n",
    "                                for target in ['america', 'citizen']\n",
    "                                    if w.lower().startswith(target))\n",
    "cfd.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['El',\n",
       " 'grupo',\n",
       " 'estatal',\n",
       " 'Electricité_de_France',\n",
       " '-Fpa-',\n",
       " 'EDF',\n",
       " '-Fpt-',\n",
       " 'anunció',\n",
       " 'hoy',\n",
       " ',',\n",
       " 'jueves',\n",
       " ',',\n",
       " 'la',\n",
       " 'compra',\n",
       " 'del',\n",
       " '51_por_ciento',\n",
       " 'de',\n",
       " 'la',\n",
       " 'empresa',\n",
       " 'mexicana']"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nltk.corpus.cess_esp.words()[:20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Um', 'revivalismo', 'refrescante', 'O', '7_e_Meio', ...]"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nltk.corpus.floresta.words()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['पूर्ण', 'प्रतिबंध', 'हटाओ', ':', 'इराक', 'संयुक्त', ...]"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nltk.corpus.indian.words('hindi.pos')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Abkhaz-Cyrillic+Abkh',\n",
       " 'Abkhaz-UTF8',\n",
       " 'Achehnese-Latin1',\n",
       " 'Achuar-Shiwiar-Latin1',\n",
       " 'Adja-UTF8',\n",
       " 'Afaan_Oromo_Oromiffa-Latin1',\n",
       " 'Afrikaans-Latin1',\n",
       " 'Aguaruna-Latin1',\n",
       " 'Akuapem_Twi-UTF8',\n",
       " 'Albanian_Shqip-Latin1',\n",
       " 'Amahuaca',\n",
       " 'Amahuaca-Latin1',\n",
       " 'Amarakaeri-Latin1',\n",
       " 'Amuesha-Yanesha-UTF8',\n",
       " 'Arabela-Latin1',\n",
       " 'Arabic_Alarabia-Arabic',\n",
       " 'Asante-UTF8',\n",
       " 'Ashaninca-Latin1',\n",
       " 'Asheninca-Latin1',\n",
       " 'Asturian_Bable-Latin1']"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nltk.corpus.udhr.fileids()[:20]  # 检索语言"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['PRANYATAN', 'UMUM', 'NGENANI', 'HAK', '-', 'HAK', ...]"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nltk.corpus.udhr.words('Javanese-Latin1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x20062abe8e0>"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.corpus import udhr  # 引入世界人权宣言语料\n",
    "languages = ['Chickasaw', 'English', 'German_Deutsch']\n",
    "cfd = nltk.ConditionalFreqDist(\n",
    "    (lang, len(word)) for lang in languages\n",
    "                        for word in udhr.words(lang + '-Latin1'))\n",
    "cfd.plot(cumulative=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'The Adventures of B'"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.corpus import gutenberg  # 书籍语料\n",
    "raw = gutenberg.raw('burgess-busterbrown.txt')\n",
    "raw[1:20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['The',\n",
       " 'Adventures',\n",
       " 'of',\n",
       " 'Buster',\n",
       " 'Bear',\n",
       " 'by',\n",
       " 'Thornton',\n",
       " 'W',\n",
       " '.',\n",
       " 'Burgess',\n",
       " '1920',\n",
       " ']',\n",
       " 'I',\n",
       " 'BUSTER',\n",
       " 'BEAR',\n",
       " 'GOES',\n",
       " 'FISHING',\n",
       " 'Buster',\n",
       " 'Bear']"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "words = gutenberg.words('burgess-busterbrown.txt')\n",
    "words[1:20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['I'],\n",
       " ['BUSTER', 'BEAR', 'GOES', 'FISHING'],\n",
       " ['Buster',\n",
       "  'Bear',\n",
       "  'yawned',\n",
       "  'as',\n",
       "  'he',\n",
       "  'lay',\n",
       "  'on',\n",
       "  'his',\n",
       "  'comfortable',\n",
       "  'bed',\n",
       "  'of',\n",
       "  'leaves',\n",
       "  'and',\n",
       "  'watched',\n",
       "  'the',\n",
       "  'first',\n",
       "  'early',\n",
       "  'morning',\n",
       "  'sunbeams',\n",
       "  'creeping',\n",
       "  'through',\n",
       "  'the',\n",
       "  'Green',\n",
       "  'Forest',\n",
       "  'to',\n",
       "  'chase',\n",
       "  'out',\n",
       "  'the',\n",
       "  'Black',\n",
       "  'Shadows',\n",
       "  '.']]"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sents = gutenberg.sents('burgess-busterbrown.txt')\n",
    "sents[1:4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['.ipynb_checkpoints/获得文本语料和词汇资料-checkpoint.ipynb',\n",
       " '.ipynb_checkpoints/语言处理与Python-checkpoint.ipynb',\n",
       " 'my_text.txt',\n",
       " '获得文本语料和词汇资料.ipynb',\n",
       " '语言处理与Python.ipynb']"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.corpus import PlaintextCorpusReader  # 导入自己的预料库\n",
    "corpus_root = '.'\n",
    "wordlists = PlaintextCorpusReader(corpus_root, \".*\")\n",
    "wordlists.fileids()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['I', 'am', 'hnuer', ',', 'and', 'you', '?', 'Me', ',', ...]"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wordlists.words('my_text.txt')  # 使用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [],
   "source": [
    "def generate_model(cfdist, word, num=15):  # 生成随机文本\n",
    "    for i in range(num):\n",
    "        print(word)\n",
    "        word = cfdist[word].max()\n",
    "        \n",
    "text = nltk.corpus.genesis.words('english-kjv.txt')\n",
    "bigrams = nltk.bigrams(text)  # 相邻词对\n",
    "cfd = nltk.ConditionalFreqDist(bigrams)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "FreqDist({'creature': 7, 'thing': 4, 'substance': 2, 'soul': 1, '.': 1, ',': 1})"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cfd['living']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "living\n",
      "creature\n",
      "that\n",
      "he\n",
      "said\n",
      ",\n",
      "and\n",
      "the\n",
      "land\n",
      "of\n",
      "the\n",
      "land\n",
      "of\n",
      "the\n",
      "land\n"
     ]
    }
   ],
   "source": [
    "generate_model(cfd, 'living')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<ConditionalFreqDist with 3 conditions>"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pairs = [('a', 'b'), ('b', 'c'), ('c', 'a'), ('c', 'd')]\n",
    "cfd = nltk.ConditionalFreqDist(pairs)\n",
    "cfd  # 有3个条件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['a', 'b', 'c']"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cfd.conditions()  # 将条件按字母排序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "FreqDist({'a': 1, 'd': 1})"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cfd['c']  # 查看此条件下的频率分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cfd['c']['b']  # 查看指定条件和样本的频率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  a b c d \n",
      "a 0 1 0 0 \n",
      "b 0 0 1 0 \n",
      "c 1 0 0 1 \n"
     ]
    }
   ],
   "source": [
    "cfd.tabulate()  # 为条件频率分布制表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x2006a00a790>"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cfd.plot()  # 为条件频率分布绘图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['abbeyland',\n",
       " 'abhorred',\n",
       " 'abilities',\n",
       " 'abounded',\n",
       " 'abridgement',\n",
       " 'abused',\n",
       " 'abuses',\n",
       " 'accents',\n",
       " 'accepting',\n",
       " 'accommodations']"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 过滤高频词汇\n",
    "def unusual_words(text):\n",
    "    text_vocab = set(w.lower() for w in text if w.isalpha())  # 不重复英文单词\n",
    "    english_vocab = set(w.lower() for w in nltk.corpus.words.words())  # 所有单词\n",
    "    # 返回text_vocab不同于english_vocab的词\n",
    "    unusual = text_vocab.difference(english_vocab)  \n",
    "    return sorted(unusual)\n",
    "\n",
    "unusual_words(nltk.corpus.gutenberg.words('austen-sense.txt'))[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', \"you're\"]"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.corpus import stopwords  # 停用词\n",
    "stopwords.words('english')[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.735240435097661"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算非停用词比例\n",
    "def content_fraction(text):\n",
    "    stopwords = nltk.corpus.stopwords.words('english')\n",
    "    context = [w for w in text if w.lower() not in stopwords]\n",
    "    return len(context) / len(text)\n",
    "\n",
    "content_fraction(nltk.corpus.reuters.words())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "FreqDist({'v': 2, 'e': 1, 'g': 1, 'i': 1, 'r': 1, 'o': 1, 'n': 1, 'l': 1})"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "puzzle_letters = nltk.FreqDist('egivrvonl')  # 计算词频\n",
    "puzzle_letters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "glover\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "gorlin\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "govern\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "grovel\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "ignore\n",
      "<FreqDist with 7 samples and 8 outcomes>\n",
      "involver\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "lienor\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "linger\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "longer\n",
      "<FreqDist with 8 samples and 8 outcomes>\n",
      "lovering\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "noiler\n",
      "<FreqDist with 8 samples and 8 outcomes>\n",
      "overling\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "region\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "renvoi\n",
      "<FreqDist with 8 samples and 9 outcomes>\n",
      "revolving\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "ringle\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "roving\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "violer\n",
      "<FreqDist with 6 samples and 6 outcomes>\n",
      "virole\n"
     ]
    }
   ],
   "source": [
    "obligatory = 'r'\n",
    "wordlist = nltk.corpus.words.words()\n",
    "for w in wordlist:\n",
    "    if len(w) >= 6 and obligatory in w and nltk.FreqDist(w) <= puzzle_letters:\n",
    "        print(w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a\n",
      "abed\n",
      "ace\n",
      "ad\n",
      "ade\n",
      "ae\n",
      "b\n",
      "ba\n",
      "bac\n",
      "bad\n",
      "bade\n",
      "bae\n",
      "be\n",
      "bead\n",
      "bed\n",
      "c\n",
      "ca\n",
      "cab\n",
      "cad\n",
      "cade\n",
      "ce\n",
      "d\n",
      "da\n",
      "dab\n",
      "dace\n",
      "dae\n",
      "de\n",
      "deb\n",
      "e\n",
      "ea\n",
      "ecad\n",
      "a\n",
      "bad\n",
      "be\n",
      "bed\n"
     ]
    }
   ],
   "source": [
    "# 获取不大于指定词频的单词\n",
    "target = 'abcde'\n",
    "wordlist = nltk.corpus.words.words()\n",
    "for w in wordlist:\n",
    "    if nltk.FreqDist(w) <= nltk.FreqDist(target):\n",
    "        print(w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['female.txt', 'male.txt']"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "names = nltk.corpus.names  # 名字预料库\n",
    "names.fileids()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Aamir',\n",
       " 'Aaron',\n",
       " 'Abbey',\n",
       " 'Abbie',\n",
       " 'Abbot',\n",
       " 'Abbott',\n",
       " 'Abby',\n",
       " 'Abdel',\n",
       " 'Abdul',\n",
       " 'Abdulkarim']"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "male_names = names.words('male.txt')\n",
    "male_names[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "133737"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "entries = nltk.corpus.cmudict.entries()  # 发音语料\n",
    "len(v)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('a', ['AH0'])\n",
      "('a.', ['EY1'])\n",
      "('a', ['EY1'])\n",
      "('a42128', ['EY1', 'F', 'AO1', 'R', 'T', 'UW1', 'W', 'AH1', 'N', 'T', 'UW1', 'EY1', 'T'])\n",
      "('aaa', ['T', 'R', 'IH2', 'P', 'AH0', 'L', 'EY1'])\n",
      "('aaberg', ['AA1', 'B', 'ER0', 'G'])\n",
      "('aachen', ['AA1', 'K', 'AH0', 'N'])\n",
      "('aachener', ['AA1', 'K', 'AH0', 'N', 'ER0'])\n",
      "('aaker', ['AA1', 'K', 'ER0'])\n",
      "('aalseth', ['AA1', 'L', 'S', 'EH0', 'TH'])\n"
     ]
    }
   ],
   "source": [
    "for entry in entries[:10]:\n",
    "    print(entry)  # 每个词后面是声音的标签，类似音节（同一个词可能多种发音）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['aaberg',\n",
       " 'aachen',\n",
       " 'aachener',\n",
       " 'aaker',\n",
       " 'aalseth',\n",
       " 'aamodt',\n",
       " 'aancor',\n",
       " 'aardvark',\n",
       " 'aaronson',\n",
       " \"aaronson's\"]"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 找到所有发音开头与aalseth相似的词汇\n",
    "syllable = 'AA1'\n",
    "[word for word, pron in entries if syllable in pron][:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['abyssinia',\n",
       " 'abyssinian',\n",
       " 'aforementioned',\n",
       " 'aggrandizement',\n",
       " 'aggrandizing',\n",
       " 'angelika',\n",
       " 'chicagoans',\n",
       " 'dedeurwaerder',\n",
       " 'elitism',\n",
       " 'enfranchises',\n",
       " 'escapism',\n",
       " 'gesamtmetall',\n",
       " 'idealizes',\n",
       " 'idealizing',\n",
       " 'impregnated',\n",
       " 'impregnating',\n",
       " 'infiltrated',\n",
       " 'infiltrating',\n",
       " 'insituform',\n",
       " 'inundating',\n",
       " 'lanai-city',\n",
       " \"martinez's\",\n",
       " 'nonlinear',\n",
       " 'oncogenes',\n",
       " 'policewoman',\n",
       " 'policewomen',\n",
       " 'recommited',\n",
       " 'reoccupy',\n",
       " 'reprogramming',\n",
       " 'subcontractor',\n",
       " 'torpedoing',\n",
       " 'untrustworthy']"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def stress(pron):\n",
    "    return [char for phone in pron for char in phone if char.isdigit()]\n",
    "\n",
    "# 提取重音词，其中主重音（1）、次重音（2）和无重音（0）\n",
    "[w for w, pron in entries if stress(pron) == ['0', '1', '2', '0']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('P-P', 'paap'),\n",
       " ('P-P', 'paape'),\n",
       " ('P-R', 'paar'),\n",
       " ('P-SH', 'paasch'),\n",
       " ('P-K', 'pac'),\n",
       " ('P-S', 'pace'),\n",
       " ('P-K', 'pack'),\n",
       " ('P-D', 'pad'),\n",
       " ('P-K', 'paek'),\n",
       " ('P-TH', 'paeth')]"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p3 = [(pron[0] + '-' + pron[2], word) for (word, pron) in entries\n",
    "     if pron[0] == 'P' and len(pron) == 3]\n",
    "p3[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "P-P paap paape pap pape papp paup peep pep pip pipe pipp poop pop pope pop ...\n",
      "P-R paar pair par pare parr pear peer pier poor poore por pore porr pour ...\n",
      "P-SH paasch pash pesch pesh posch posh pusch push ...\n",
      "P-K pac pack paek paik pak pake paque peak peake pech peck peek perc perk  ...\n",
      "P-S puss pace pass pasts peace pearse pease perce pers perse pesce piece p ...\n",
      "P-D pad paid pawed peed pied pod poohed ...\n",
      "P-TH paeth path pathe perth peth pith poth puth ...\n",
      "P-F paff poff poof puff ...\n",
      "P-JH page paige podge purge ...\n",
      "P-L pall pahl pail paille pal pale paul paule paull peal peale pearl pearl ...\n",
      "P-IY0 pai ...\n",
      "P-N paign pain paine pan pane pawn payne peine pen penh penn pin pine pinn ...\n",
      "P-Z pais paiz pao's pas pause paws pays paz peas pease pei's perz pez pies ...\n",
      "P-T pait pat pate patt peart peat peet peete pert pet pete pett piet piett ...\n",
      "P-M palm palme pam pimm pom pymm ...\n",
      "P-NG pang peng ping pong pung ...\n",
      "P-CH patch pautsch peach perch petsch petsche piche piech pietsch pitch pit ...\n",
      "P-V pave peeve ...\n",
      "P-ER0 payer poer power poyer pyre ...\n",
      "P-ER1 payeur ...\n",
      "P-G peg pegg pig pigg pigue poag pog pogue pug puig ...\n",
      "P-AH0 pera pia ...\n",
      "P-OW0 pero pio ...\n",
      "P-OW1 perot plough pro ...\n",
      "P-UW1 peru peugh pew plew plue prew pru prue prugh pshew pugh ...\n",
      "P-AA1 pla ...\n",
      "P-EY1 play pray prey ...\n",
      "P-IY1 plea pre pree pri prix ...\n",
      "P-AW1 plough plow prough prow ...\n",
      "P-OY1 ploy ...\n",
      "P-AY1 ply pri pry ...\n",
      "P-B pub ...\n"
     ]
    }
   ],
   "source": [
    "cfd = nltk.ConditionalFreqDist(p3)\n",
    "for template in cfd.conditions():  # 获取所有条件，如'P-TH'、'P-K'等\n",
    "    if len(cfd[template]) > 0:  # 对应条件有元素\n",
    "        words = cfd[template]\n",
    "        wordlist = ' '.join(words)\n",
    "        print(template, wordlist[:70] + ' ...')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['F', 'AY1', 'ER0'], ['F', 'AY1', 'R']]"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 获取发音词典（若无则可以手动添加，但是对NLTK预料库不影响）\n",
    "prondict = nltk.corpus.cmudict.dict()\n",
    "prondict['fire']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['be',\n",
       " 'bg',\n",
       " 'bs',\n",
       " 'ca',\n",
       " 'cs',\n",
       " 'cu',\n",
       " 'de',\n",
       " 'en',\n",
       " 'es',\n",
       " 'fr',\n",
       " 'hr',\n",
       " 'it',\n",
       " 'la',\n",
       " 'mk',\n",
       " 'nl',\n",
       " 'pl',\n",
       " 'pt',\n",
       " 'ro',\n",
       " 'ru',\n",
       " 'sk',\n",
       " 'sl',\n",
       " 'sr',\n",
       " 'sw',\n",
       " 'uk']"
      ]
     },
     "execution_count": 165,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.corpus import swadesh  # 比较词表，多种语言都含200左右常用词\n",
    "swadesh.fileids()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['I',\n",
       " 'you (singular), thou',\n",
       " 'he',\n",
       " 'we',\n",
       " 'you (plural)',\n",
       " 'they',\n",
       " 'this',\n",
       " 'that',\n",
       " 'here',\n",
       " 'there']"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "swadesh.words('en')[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('je', 'I'),\n",
       " ('tu, vous', 'you (singular), thou'),\n",
       " ('il', 'he'),\n",
       " ('nous', 'we'),\n",
       " ('vous', 'you (plural)'),\n",
       " ('ils, elles', 'they'),\n",
       " ('ceci', 'this'),\n",
       " ('cela', 'that'),\n",
       " ('ici', 'here'),\n",
       " ('là', 'there')]"
      ]
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fr2en = swadesh.entries(['fr', 'en'])  # 不同语言的同源词\n",
    "fr2en[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'dog'"
      ]
     },
     "execution_count": 170,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "translate = dict(fr2en)  # 翻译 fr -> en\n",
    "translate['chien']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'dog'"
      ]
     },
     "execution_count": 171,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 更新翻译词典\n",
    "de2en = swadesh.entries(['de', 'en'])\n",
    "translate.update(dict(de2en))  # 加入德语\n",
    "translate['Hund']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('car.n.01')]"
      ]
     },
     "execution_count": 174,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.corpus import wordnet as wn  \n",
    "wn.synsets('motorcar')  # 查找'motorcar'的同义词集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['car', 'auto', 'automobile', 'machine', 'motorcar']"
      ]
     },
     "execution_count": 176,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('car.n.01').lemma_names()  # 查看同义词"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'a motor vehicle with four wheels; usually propelled by an internal combustion engine'"
      ]
     },
     "execution_count": 178,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('car.n.01').definition()  # 定义"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['he needs a car to get to work']"
      ]
     },
     "execution_count": 180,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('car.n.01').examples()  # 例句"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Lemma('car.n.01.car'),\n",
       " Lemma('car.n.01.auto'),\n",
       " Lemma('car.n.01.automobile'),\n",
       " Lemma('car.n.01.machine'),\n",
       " Lemma('car.n.01.motorcar')]"
      ]
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('car.n.01').lemmas()  # 同义词集的所有词条"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Lemma('car.n.01.automobile')"
      ]
     },
     "execution_count": 183,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.lemma('car.n.01.automobile')  # 查找特定的词条"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Synset('car.n.01')"
      ]
     },
     "execution_count": 185,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.lemma('car.n.01.automobile').synset()  # 得到词条的对应同义词集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'automobile'"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.lemma('car.n.01.automobile').name()  # 得到词条的\"名字\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('car.n.01'),\n",
       " Synset('car.n.02'),\n",
       " Synset('car.n.03'),\n",
       " Synset('car.n.04'),\n",
       " Synset('cable_car.n.01')]"
      ]
     },
     "execution_count": 187,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synsets('car')  # 与'motorcar'不同，有5个词集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['car', 'auto', 'automobile', 'machine', 'motorcar']\n",
      "['car', 'railcar', 'railway_car', 'railroad_car']\n",
      "['car', 'gondola']\n",
      "['car', 'elevator_car']\n",
      "['cable_car', 'car']\n"
     ]
    }
   ],
   "source": [
    "for synset in wn.synsets('car'):  # 查看每个同义词集的同义词\n",
    "    print(synset.lemma_names())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Lemma('car.n.01.car'),\n",
       " Lemma('car.n.02.car'),\n",
       " Lemma('car.n.03.car'),\n",
       " Lemma('car.n.04.car'),\n",
       " Lemma('cable_car.n.01.car')]"
      ]
     },
     "execution_count": 189,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.lemmas('car')  # 查看包含'car'的所有词条"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('ambulance.n.01'),\n",
       " Synset('beach_wagon.n.01'),\n",
       " Synset('bus.n.04'),\n",
       " Synset('cab.n.03'),\n",
       " Synset('compact.n.03'),\n",
       " Synset('convertible.n.01'),\n",
       " Synset('coupe.n.01'),\n",
       " Synset('cruiser.n.01'),\n",
       " Synset('electric.n.01'),\n",
       " Synset('gas_guzzler.n.01'),\n",
       " Synset('hardtop.n.01'),\n",
       " Synset('hatchback.n.01'),\n",
       " Synset('horseless_carriage.n.01'),\n",
       " Synset('hot_rod.n.01'),\n",
       " Synset('jeep.n.01'),\n",
       " Synset('limousine.n.01'),\n",
       " Synset('loaner.n.02'),\n",
       " Synset('minicar.n.01'),\n",
       " Synset('minivan.n.01'),\n",
       " Synset('model_t.n.01'),\n",
       " Synset('pace_car.n.01'),\n",
       " Synset('racer.n.02'),\n",
       " Synset('roadster.n.01'),\n",
       " Synset('sedan.n.01'),\n",
       " Synset('sport_utility.n.01'),\n",
       " Synset('sports_car.n.01'),\n",
       " Synset('stanley_steamer.n.01'),\n",
       " Synset('stock_car.n.01'),\n",
       " Synset('subcompact.n.01'),\n",
       " Synset('touring_car.n.01'),\n",
       " Synset('used-car.n.01')]"
      ]
     },
     "execution_count": 191,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "motorcar = wn.synset('car.n.01')\n",
    "type_of_motorcar = motorcar.hyponyms()  # 下位词（包含的词集）\n",
    "type_of_motorcar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('motor_vehicle.n.01')]"
      ]
     },
     "execution_count": 192,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "motorcar.hypernyms()  # 上位词（父词集）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2,\n",
       " [[Synset('entity.n.01'),\n",
       "   Synset('physical_entity.n.01'),\n",
       "   Synset('object.n.01'),\n",
       "   Synset('whole.n.02'),\n",
       "   Synset('artifact.n.01'),\n",
       "   Synset('instrumentality.n.03'),\n",
       "   Synset('container.n.01'),\n",
       "   Synset('wheeled_vehicle.n.01'),\n",
       "   Synset('self-propelled_vehicle.n.01'),\n",
       "   Synset('motor_vehicle.n.01'),\n",
       "   Synset('car.n.01')],\n",
       "  [Synset('entity.n.01'),\n",
       "   Synset('physical_entity.n.01'),\n",
       "   Synset('object.n.01'),\n",
       "   Synset('whole.n.02'),\n",
       "   Synset('artifact.n.01'),\n",
       "   Synset('instrumentality.n.03'),\n",
       "   Synset('conveyance.n.03'),\n",
       "   Synset('vehicle.n.01'),\n",
       "   Synset('wheeled_vehicle.n.01'),\n",
       "   Synset('self-propelled_vehicle.n.01'),\n",
       "   Synset('motor_vehicle.n.01'),\n",
       "   Synset('car.n.01')]])"
      ]
     },
     "execution_count": 197,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "paths = motorcar.hypernym_paths()\n",
    "len(paths), paths"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('entity.n.01')]"
      ]
     },
     "execution_count": 198,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "motorcar.root_hypernyms()  # 根上位词"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from nltk.corpus import wordnet as wn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('burl.n.02'),\n",
       " Synset('crown.n.07'),\n",
       " Synset('limb.n.02'),\n",
       " Synset('stump.n.01'),\n",
       " Synset('trunk.n.01')]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('tree.n.01').part_meronyms()  # 包含的部分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('heartwood.n.01'), Synset('sapwood.n.01')]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('tree.n.01').substance_meronyms()  # 其实质"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('forest.n.01')]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('tree.n.01').member_holonyms()  # 组成的整体"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "batch.n.02 : (often followed by `of') a large number or amount or extent\n",
      "mint.n.02 : any north temperate plant of the genus Mentha with aromatic leaves and small mauve flowers\n",
      "mint.n.03 : any member of the mint family of plants\n",
      "mint.n.04 : the leaves of a mint plant used fresh or candied\n",
      "mint.n.05 : a candy that is flavored with a mint oil\n",
      "mint.n.06 : a plant where money is coined by authority of the government\n"
     ]
    }
   ],
   "source": [
    "for synset in wn.synsets('mint', wn.NOUN):\n",
    "    print(synset.name(), ':', synset.definition())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('mint.n.02')]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('mint.n.04').part_holonyms()  # 叶子是薄荷的一部分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('mint.n.05')]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('mint.n.04').substance_holonyms()  # 用薄荷油制作的糖材质是薄荷"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('step.v.01')]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('walk.v.01').entailments()  # 走路的\"需求\"包括抬脚"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('chew.v.01'), Synset('swallow.v.01')]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('eat.v.01').entailments()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Lemma('demand.n.02.demand')]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.lemma('supply.n.02.supply').antonyms()  # \"供给\"的反义词是\"需求\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['member_meronyms',\n",
       " 'min_depth',\n",
       " 'name',\n",
       " 'offset',\n",
       " 'part_holonyms',\n",
       " 'part_meronyms',\n",
       " 'path_similarity',\n",
       " 'pos',\n",
       " 'region_domains',\n",
       " 'res_similarity',\n",
       " 'root_hypernyms',\n",
       " 'shortest_path_distance',\n",
       " 'similar_tos',\n",
       " 'substance_holonyms',\n",
       " 'substance_meronyms',\n",
       " 'topic_domains',\n",
       " 'tree',\n",
       " 'usage_domains',\n",
       " 'verb_groups',\n",
       " 'wup_similarity']"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dir(wn.synset('harmony.n.02'))[-20:]  # 查看指定词集的所有方法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 语义相似度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Synset('baleen_whale.n.01')]"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "right = wn.synset('right_whale.n.01')\n",
    "orca = wn.synset('orca.n.01')\n",
    "minke = wn.synset('minke_whale.n.01')\n",
    "tortoise = wn.synset('tortoise.n.01')\n",
    "novel = wn.synset('novel.n.01')\n",
    "\n",
    "right.lowest_common_hypernyms(minke)  # 语义最相近的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "14"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('baleen_whale.n.01').min_depth()  # 同义词集深度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "13"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('whale.n.02').min_depth()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wn.synset('entity.n.01').min_depth()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.25"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "right.path_similarity(minke)  # 求取相似度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.07692307692307693"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "right.path_similarity(tortoise)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on WordNetCorpusReader in module nltk.corpus.reader.wordnet object:\n",
      "\n",
      "class WordNetCorpusReader(nltk.corpus.reader.api.CorpusReader)\n",
      " |  WordNetCorpusReader(root, omw_reader)\n",
      " |  \n",
      " |  A corpus reader used to access wordnet or its variants.\n",
      " |  \n",
      " |  Method resolution order:\n",
      " |      WordNetCorpusReader\n",
      " |      nltk.corpus.reader.api.CorpusReader\n",
      " |      builtins.object\n",
      " |  \n",
      " |  Methods defined here:\n",
      " |  \n",
      " |  __init__(self, root, omw_reader)\n",
      " |      Construct a new wordnet corpus reader, with the given root\n",
      " |      directory.\n",
      " |  \n",
      " |  all_lemma_names(self, pos=None, lang='eng')\n",
      " |      Return all lemma names for all synsets for the given\n",
      " |      part of speech tag and language or languages. If pos is\n",
      " |      not specified, all synsets for all parts of speech will\n",
      " |      be used.\n",
      " |  \n",
      " |  all_synsets(self, pos=None)\n",
      " |      Iterate over all synsets with a given part of speech tag.\n",
      " |      If no pos is specified, all synsets for all parts of speech\n",
      " |      will be loaded.\n",
      " |  \n",
      " |  citation(self, lang='omw')\n",
      " |      Return the contents of citation.bib file (for omw)\n",
      " |      use lang=lang to get the citation for an individual language\n",
      " |  \n",
      " |  custom_lemmas(self, tab_file, lang)\n",
      " |      Reads a custom tab file containing mappings of lemmas in the given\n",
      " |      language to Princeton WordNet 3.0 synset offsets, allowing NLTK's\n",
      " |      WordNet functions to then be used with that language.\n",
      " |      \n",
      " |      See the \"Tab files\" section at http://compling.hss.ntu.edu.sg/omw/ for\n",
      " |      documentation on the Multilingual WordNet tab file format.\n",
      " |      \n",
      " |      :param tab_file: Tab file as a file or file-like object\n",
      " |      :type  lang str\n",
      " |      :param lang ISO 639-3 code of the language of the tab file\n",
      " |  \n",
      " |  get_version(self)\n",
      " |  \n",
      " |  ic(self, corpus, weight_senses_equally=False, smoothing=1.0)\n",
      " |      Creates an information content lookup dictionary from a corpus.\n",
      " |      \n",
      " |      :type corpus: CorpusReader\n",
      " |      :param corpus: The corpus from which we create an information\n",
      " |      content dictionary.\n",
      " |      :type weight_senses_equally: bool\n",
      " |      :param weight_senses_equally: If this is True, gives all\n",
      " |      possible senses equal weight rather than dividing by the\n",
      " |      number of possible senses.  (If a word has 3 synses, each\n",
      " |      sense gets 0.3333 per appearance when this is False, 1.0 when\n",
      " |      it is true.)\n",
      " |      :param smoothing: How much do we smooth synset counts (default is 1.0)\n",
      " |      :type smoothing: float\n",
      " |      :return: An information content dictionary\n",
      " |  \n",
      " |  jcn_similarity(self, synset1, synset2, ic, verbose=False)\n",
      " |      Jiang-Conrath Similarity:\n",
      " |      Return a score denoting how similar two word senses are, based on the\n",
      " |      Information Content (IC) of the Least Common Subsumer (most specific\n",
      " |      ancestor node) and that of the two input Synsets. The relationship is\n",
      " |      given by the equation 1 / (IC(s1) + IC(s2) - 2 * IC(lcs)).\n",
      " |      \n",
      " |      :type  other: Synset\n",
      " |      :param other: The ``Synset`` that this ``Synset`` is being compared to.\n",
      " |      :type  ic: dict\n",
      " |      :param ic: an information content object (as returned by\n",
      " |          ``nltk.corpus.wordnet_ic.ic()``).\n",
      " |      :return: A float score denoting the similarity of the two ``Synset``\n",
      " |          objects.\n",
      " |  \n",
      " |  langs(self)\n",
      " |      return a list of languages supported by Multilingual Wordnet\n",
      " |  \n",
      " |  lch_similarity(self, synset1, synset2, verbose=False, simulate_root=True)\n",
      " |      Leacock Chodorow Similarity:\n",
      " |      Return a score denoting how similar two word senses are, based on the\n",
      " |      shortest path that connects the senses (as above) and the maximum depth\n",
      " |      of the taxonomy in which the senses occur. The relationship is given as\n",
      " |      -log(p/2d) where p is the shortest path length and d is the taxonomy\n",
      " |      depth.\n",
      " |      \n",
      " |      :type  other: Synset\n",
      " |      :param other: The ``Synset`` that this ``Synset`` is being compared to.\n",
      " |      :type simulate_root: bool\n",
      " |      :param simulate_root: The various verb taxonomies do not\n",
      " |          share a single root which disallows this metric from working for\n",
      " |          synsets that are not connected. This flag (True by default)\n",
      " |          creates a fake root that connects all the taxonomies. Set it\n",
      " |          to false to disable this behavior. For the noun taxonomy,\n",
      " |          there is usually a default root except for WordNet version 1.6.\n",
      " |          If you are using wordnet 1.6, a fake root will be added for nouns\n",
      " |          as well.\n",
      " |      :return: A score denoting the similarity of the two ``Synset`` objects,\n",
      " |          normally greater than 0. None is returned if no connecting path\n",
      " |          could be found. If a ``Synset`` is compared with itself, the\n",
      " |          maximum score is returned, which varies depending on the taxonomy\n",
      " |          depth.\n",
      " |  \n",
      " |  lemma(self, name, lang='eng')\n",
      " |      Return lemma object that matches the name\n",
      " |  \n",
      " |  lemma_count(self, lemma)\n",
      " |      Return the frequency count for this Lemma\n",
      " |  \n",
      " |  lemma_from_key(self, key)\n",
      " |  \n",
      " |  lemmas(self, lemma, pos=None, lang='eng')\n",
      " |      Return all Lemma objects with a name matching the specified lemma\n",
      " |      name and part of speech tag. Matches any part of speech tag if none is\n",
      " |      specified.\n",
      " |  \n",
      " |  license(self, lang='eng')\n",
      " |      Return the contents of LICENSE (for omw)\n",
      " |      use lang=lang to get the license for an individual language\n",
      " |  \n",
      " |  lin_similarity(self, synset1, synset2, ic, verbose=False)\n",
      " |      Lin Similarity:\n",
      " |      Return a score denoting how similar two word senses are, based on the\n",
      " |      Information Content (IC) of the Least Common Subsumer (most specific\n",
      " |      ancestor node) and that of the two input Synsets. The relationship is\n",
      " |      given by the equation 2 * IC(lcs) / (IC(s1) + IC(s2)).\n",
      " |      \n",
      " |      :type other: Synset\n",
      " |      :param other: The ``Synset`` that this ``Synset`` is being compared to.\n",
      " |      :type ic: dict\n",
      " |      :param ic: an information content object (as returned by\n",
      " |          ``nltk.corpus.wordnet_ic.ic()``).\n",
      " |      :return: A float score denoting the similarity of the two ``Synset``\n",
      " |          objects, in the range 0 to 1.\n",
      " |  \n",
      " |  morphy(self, form, pos=None, check_exceptions=True)\n",
      " |      Find a possible base form for the given form, with the given\n",
      " |      part of speech, by checking WordNet's list of exceptional\n",
      " |      forms, and by recursively stripping affixes for this part of\n",
      " |      speech until a form in WordNet is found.\n",
      " |      \n",
      " |      >>> from nltk.corpus import wordnet as wn\n",
      " |      >>> print(wn.morphy('dogs'))\n",
      " |      dog\n",
      " |      >>> print(wn.morphy('churches'))\n",
      " |      church\n",
      " |      >>> print(wn.morphy('aardwolves'))\n",
      " |      aardwolf\n",
      " |      >>> print(wn.morphy('abaci'))\n",
      " |      abacus\n",
      " |      >>> wn.morphy('hardrock', wn.ADV)\n",
      " |      >>> print(wn.morphy('book', wn.NOUN))\n",
      " |      book\n",
      " |      >>> wn.morphy('book', wn.ADJ)\n",
      " |  \n",
      " |  of2ss(self, of)\n",
      " |      take an id and return the synsets\n",
      " |  \n",
      " |  path_similarity(self, synset1, synset2, verbose=False, simulate_root=True)\n",
      " |      Path Distance Similarity:\n",
      " |      Return a score denoting how similar two word senses are, based on the\n",
      " |      shortest path that connects the senses in the is-a (hypernym/hypnoym)\n",
      " |      taxonomy. The score is in the range 0 to 1, except in those cases where\n",
      " |      a path cannot be found (will only be true for verbs as there are many\n",
      " |      distinct verb taxonomies), in which case None is returned. A score of\n",
      " |      1 represents identity i.e. comparing a sense with itself will return 1.\n",
      " |      \n",
      " |      :type other: Synset\n",
      " |      :param other: The ``Synset`` that this ``Synset`` is being compared to.\n",
      " |      :type simulate_root: bool\n",
      " |      :param simulate_root: The various verb taxonomies do not\n",
      " |          share a single root which disallows this metric from working for\n",
      " |          synsets that are not connected. This flag (True by default)\n",
      " |          creates a fake root that connects all the taxonomies. Set it\n",
      " |          to false to disable this behavior. For the noun taxonomy,\n",
      " |          there is usually a default root except for WordNet version 1.6.\n",
      " |          If you are using wordnet 1.6, a fake root will be added for nouns\n",
      " |          as well.\n",
      " |      :return: A score denoting the similarity of the two ``Synset`` objects,\n",
      " |          normally between 0 and 1. None is returned if no connecting path\n",
      " |          could be found. 1 is returned if a ``Synset`` is compared with\n",
      " |          itself.\n",
      " |  \n",
      " |  readme(self, lang='omw')\n",
      " |      Return the contents of README (for omw)\n",
      " |      use lang=lang to get the readme for an individual language\n",
      " |  \n",
      " |  res_similarity(self, synset1, synset2, ic, verbose=False)\n",
      " |      Resnik Similarity:\n",
      " |      Return a score denoting how similar two word senses are, based on the\n",
      " |      Information Content (IC) of the Least Common Subsumer (most specific\n",
      " |      ancestor node).\n",
      " |      \n",
      " |      :type  other: Synset\n",
      " |      :param other: The ``Synset`` that this ``Synset`` is being compared to.\n",
      " |      :type ic: dict\n",
      " |      :param ic: an information content object (as returned by\n",
      " |          ``nltk.corpus.wordnet_ic.ic()``).\n",
      " |      :return: A float score denoting the similarity of the two ``Synset``\n",
      " |          objects. Synsets whose LCS is the root node of the taxonomy will\n",
      " |          have a score of 0 (e.g. N['dog'][0] and N['table'][0]).\n",
      " |  \n",
      " |  ss2of(self, ss, lang=None)\n",
      " |      return the ID of the synset\n",
      " |  \n",
      " |  synset(self, name)\n",
      " |      #############################################################\n",
      " |      # Loading Synsets\n",
      " |      #############################################################\n",
      " |  \n",
      " |  synset_from_pos_and_offset(self, pos, offset)\n",
      " |  \n",
      " |  synset_from_sense_key(self, sense_key)\n",
      " |      Retrieves synset based on a given sense_key. Sense keys can be\n",
      " |      obtained from lemma.key()\n",
      " |      \n",
      " |      From https://wordnet.princeton.edu/documentation/senseidx5wn:\n",
      " |      A sense_key is represented as:\n",
      " |          lemma % lex_sense (e.g. 'dog%1:18:01::')\n",
      " |      where lex_sense is encoded as:\n",
      " |          ss_type:lex_filenum:lex_id:head_word:head_id\n",
      " |      \n",
      " |      lemma:       ASCII text of word/collocation, in lower case\n",
      " |      ss_type:     synset type for the sense (1 digit int)\n",
      " |                   The synset type is encoded as follows:\n",
      " |                   1    NOUN\n",
      " |                   2    VERB\n",
      " |                   3    ADJECTIVE\n",
      " |                   4    ADVERB\n",
      " |                   5    ADJECTIVE SATELLITE\n",
      " |      lex_filenum: name of lexicographer file containing the synset for the sense (2 digit int)\n",
      " |      lex_id:      when paired with lemma, uniquely identifies a sense in the lexicographer file (2 digit int)\n",
      " |      head_word:   lemma of the first word in satellite's head synset\n",
      " |                   Only used if sense is in an adjective satellite synset\n",
      " |      head_id:     uniquely identifies sense in a lexicographer file when paired with head_word\n",
      " |                   Only used if head_word is present (2 digit int)\n",
      " |  \n",
      " |  synsets(self, lemma, pos=None, lang='eng', check_exceptions=True)\n",
      " |      Load all synsets with a given lemma and part of speech tag.\n",
      " |      If no pos is specified, all synsets for all parts of speech\n",
      " |      will be loaded.\n",
      " |      If lang is specified, all the synsets associated with the lemma name\n",
      " |      of that language will be returned.\n",
      " |  \n",
      " |  words(self, lang='eng')\n",
      " |      return lemmas of the given language as list of words\n",
      " |  \n",
      " |  wup_similarity(self, synset1, synset2, verbose=False, simulate_root=True)\n",
      " |      Wu-Palmer Similarity:\n",
      " |      Return a score denoting how similar two word senses are, based on the\n",
      " |      depth of the two senses in the taxonomy and that of their Least Common\n",
      " |      Subsumer (most specific ancestor node). Previously, the scores computed\n",
      " |      by this implementation did _not_ always agree with those given by\n",
      " |      Pedersen's Perl implementation of WordNet Similarity. However, with\n",
      " |      the addition of the simulate_root flag (see below), the score for\n",
      " |      verbs now almost always agree but not always for nouns.\n",
      " |      \n",
      " |      The LCS does not necessarily feature in the shortest path connecting\n",
      " |      the two senses, as it is by definition the common ancestor deepest in\n",
      " |      the taxonomy, not closest to the two senses. Typically, however, it\n",
      " |      will so feature. Where multiple candidates for the LCS exist, that\n",
      " |      whose shortest path to the root node is the longest will be selected.\n",
      " |      Where the LCS has multiple paths to the root, the longer path is used\n",
      " |      for the purposes of the calculation.\n",
      " |      \n",
      " |      :type  other: Synset\n",
      " |      :param other: The ``Synset`` that this ``Synset`` is being compared to.\n",
      " |      :type simulate_root: bool\n",
      " |      :param simulate_root: The various verb taxonomies do not\n",
      " |          share a single root which disallows this metric from working for\n",
      " |          synsets that are not connected. This flag (True by default)\n",
      " |          creates a fake root that connects all the taxonomies. Set it\n",
      " |          to false to disable this behavior. For the noun taxonomy,\n",
      " |          there is usually a default root except for WordNet version 1.6.\n",
      " |          If you are using wordnet 1.6, a fake root will be added for nouns\n",
      " |          as well.\n",
      " |      :return: A float score denoting the similarity of the two ``Synset``\n",
      " |          objects, normally greater than zero. If no connecting path between\n",
      " |          the two senses can be found, None is returned.\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data and other attributes defined here:\n",
      " |  \n",
      " |  ADJ = 'a'\n",
      " |  \n",
      " |  ADJ_SAT = 's'\n",
      " |  \n",
      " |  ADV = 'r'\n",
      " |  \n",
      " |  MORPHOLOGICAL_SUBSTITUTIONS = {'a': [('er', ''), ('est', ''), ('er', '...\n",
      " |  \n",
      " |  NOUN = 'n'\n",
      " |  \n",
      " |  VERB = 'v'\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Methods inherited from nltk.corpus.reader.api.CorpusReader:\n",
      " |  \n",
      " |  __repr__(self)\n",
      " |      Return repr(self).\n",
      " |  \n",
      " |  abspath(self, fileid)\n",
      " |      Return the absolute path for the given file.\n",
      " |      \n",
      " |      :type fileid: str\n",
      " |      :param fileid: The file identifier for the file whose path\n",
      " |          should be returned.\n",
      " |      :rtype: PathPointer\n",
      " |  \n",
      " |  abspaths(self, fileids=None, include_encoding=False, include_fileid=False)\n",
      " |      Return a list of the absolute paths for all fileids in this corpus;\n",
      " |      or for the given list of fileids, if specified.\n",
      " |      \n",
      " |      :type fileids: None or str or list\n",
      " |      :param fileids: Specifies the set of fileids for which paths should\n",
      " |          be returned.  Can be None, for all fileids; a list of\n",
      " |          file identifiers, for a specified set of fileids; or a single\n",
      " |          file identifier, for a single file.  Note that the return\n",
      " |          value is always a list of paths, even if ``fileids`` is a\n",
      " |          single file identifier.\n",
      " |      \n",
      " |      :param include_encoding: If true, then return a list of\n",
      " |          ``(path_pointer, encoding)`` tuples.\n",
      " |      \n",
      " |      :rtype: list(PathPointer)\n",
      " |  \n",
      " |  encoding(self, file)\n",
      " |      Return the unicode encoding for the given corpus file, if known.\n",
      " |      If the encoding is unknown, or if the given file should be\n",
      " |      processed using byte strings (str), then return None.\n",
      " |  \n",
      " |  ensure_loaded(self)\n",
      " |      Load this corpus (if it has not already been loaded).  This is\n",
      " |      used by LazyCorpusLoader as a simple method that can be used to\n",
      " |      make sure a corpus is loaded -- e.g., in case a user wants to\n",
      " |      do help(some_corpus).\n",
      " |  \n",
      " |  fileids(self)\n",
      " |      Return a list of file identifiers for the fileids that make up\n",
      " |      this corpus.\n",
      " |  \n",
      " |  open(self, file)\n",
      " |      Return an open stream that can be used to read the given file.\n",
      " |      If the file's encoding is not None, then the stream will\n",
      " |      automatically decode the file's contents into unicode.\n",
      " |      \n",
      " |      :param file: The file identifier of the file to read.\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Readonly properties inherited from nltk.corpus.reader.api.CorpusReader:\n",
      " |  \n",
      " |  root\n",
      " |      The directory where this corpus is stored.\n",
      " |      \n",
      " |      :type: PathPointer\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data descriptors inherited from nltk.corpus.reader.api.CorpusReader:\n",
      " |  \n",
      " |  __dict__\n",
      " |      dictionary for instance variables (if defined)\n",
      " |  \n",
      " |  __weakref__\n",
      " |      list of weak references to the object (if defined)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(wn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
